﻿#include<iostream>
#include<memory>
using namespace std;

#include"SmartPtr.hpp"


int main()
{

	try
	{
		zxj::test_shared_delete();
	}
	catch (const std::exception& e)
	{
		cout << e.what() << endl;
	}
	catch (...)
	{
		cout << "unknown anomaly" << endl;
	}
	return 0;
}


//int div()
//{
//	int a, b;
//	cin >> a >> b;
//	if (b == 0)
//		throw invalid_argument("除0错误");
//	return a / b;
//}
//void Func()
//{
//	std::shared_ptr<int> p1(new int);
//	std::shared_ptr<int> p2(new int);
//	cout << div() << endl;
//}
//int main()
//{
//	try
//	{
//		Func();
//	}
//	catch (exception& e)
//	{
//		cout << e.what() << endl;
//	}
//	return 0;
//}
//
//void MemoryLeaks()
//{
//	// 1.内存申请了忘记释放
//	int* p1 = (int*)malloc(sizeof(int));
//	int* p2 = new int;
//	// 2.异常安全问题
//	int* p3 = new int[10];
//	Func(); // 这里Func函数抛异常导致 delete[] p3未执行，p3没被释放.
//	delete[] p3;
//}

//template<class T>
//class SmartPtr {
//public:
//	SmartPtr(T* ptr = nullptr)
//		: _ptr(ptr)
//	{}
//	~SmartPtr()
//	{
//		if (_ptr)
//			delete _ptr;
//	}
//	T& operator*() { return *_ptr; }
//	T* operator->() { return _ptr; }
//private:
//	T* _ptr;
//};
//struct Date
//{
//	int _year;
//	int _month;
//	int _day;
//};
//int main()
//{
//	SmartPtr<int> sp1(new int);
//	*sp1 = 10;
//	cout << *sp1 << endl;
//	SmartPtr<Date> sparray(new Date);
//	// 需要注意的是这里应该是sparray.operator->()->_year = 2018;
//	// 本来应该是sparray->->_year这里语法上为了可读性，省略了一个->
//	sparray->_year = 2018;
//	sparray->_month = 1;
//	sparray->_day = 1;
//}